Skip to content

feat: AI 톤 교정 문체 열거형 · 문체별 지시문 (#64) - #83

Merged
chjpooh2002 merged 6 commits into
developfrom
feat/64-tone-style-prompt
Nov 10, 2026
Merged

chjpooh2002 merged 6 commits into
developfrom
feat/64-tone-style-prompt

Conversation

@chjpooh2002

@chjpooh2002 chjpooh2002 commented Nov 9, 2026 •

Copy link
Copy Markdown
Contributor

관련 이슈

작업 내용

  • 커밋: 041543c, 3d753f7, a32e160, 9dd2861, b781b27
  • 범위 밖: API·컨트롤러·서비스, AiErrorCode의 AI422_1 추가, 출력 토큰 상한 4000→6000 명세 수정은 [feat] AI 톤 교정 API #65
  • 문체 열거형 ToneStyle (domain/ai/entity): 명세 6장의 상수 6개 (감성/에세이 ESSAY 삭제). 지시문이나 표시 이름 없이 상수만 둠
  • 지시문 ToneCorrectionPrompt (domain/ai/service, 패키지 비공개)
    • systemPrompt(style): 공통 지시 + 문체: {한국어 이름} + 문체별 지시. 문체별 지시는 기본 분기 없는 switch 식이라 문체를 추가하고 지시를 빠뜨리면 컴파일이 깨짐
    • userMessage(text): <text>\n원문\n</text> (FakeLanguageModelClient가 벗기는 형식)
    • BLOCKED_MARKER = "[[SNIPTEXT_BLOCKED]]": 지시문 4번은 이 상수를 이어 붙여 만들어 판정과 문구가 어긋나지 않음
    • isBlocked(modelText): TextWhitespace 기준으로 앞뒤 공백을 지운 뒤 표식과 정확히 같을 때만 참. null은 거짓
  • 표식을 이 클래스에 둔 이유: 지시문과 판정이 같은 문자열이어야 하고, 쓰는 곳이 같은 패키지의 [feat] AI 톤 교정 API #65 서비스뿐이라 공개할 필요가 없음

기획·프론트 결정 반영 (a32e160 이후)

결정 지시문 반영
욕설·비속어는 순화하지 않고 혐오 표현과 똑같이 차단 (가벼운 비속어, 초성·변형 표기 포함) 공통 지시 4번: 혐오 표현 또는 욕설·비속어가 하나라도 있으면 표식만 출력. 욕설 없는 불만·짜증과, 욕설을 가리키기만 하는 금지·신고 안내 글은 차단하지 않고 교정
상사/외부용은 인사와 맺음말을 항상 붙임 항상 짧은 인사로 시작하고 짧은 맺음말로 끝냄. 원문에 이미 있으면 덧붙이지 않음. 원문에 없는 호칭은 만들지 않고, 원문의 호칭은 인사 앞에 둠. 약속·제안·사과 금지 유지
원문에 없는 문장을 덧붙이지 않음 (예외는 상사/외부용 인사·맺음말) 그 밖의 원칙에 추가. 마케팅은 행동 유도 문구 금지, 공지는 사과·양해 문장과 머리말·제목 덧붙이기 금지 (원문에 있는 사과는 남김)
감성/에세이 문체 삭제 ESSAY 상수·분기 삭제, 문체 6개
차단 안내 문구 명세 22번 AI422_1 문구·설명 변경 (코드 반영은 #65)
결과 3000자 초과는 프론트가 저장 전 안내 지시문의 "3000자를 넘지 않게" 문장은 그대로 둠

실제 모델 확인 중 함께 고친 것 (아래 '실제 모델 확인'의 1·2차 실패 대응)

  • 교정 과정 설명·자기 수정 문장을 쓰지 않음
  • 금액·숫자의 표기 방식도 바꾸지 않음 (예: 만 단위 표기를 쉼표 표기로 바꾸지 않음)
  • 글쓴이의 입장 유지: 불만·요청·사과를 상대에게 공감·위로하는 말로 바꾸지 않음 (부드러운 존댓말에도 같은 문장)

명세와 달라진 점

이 PR에서 명세를 함께 고침 (docs/s1-api-spec.md 버전 표에 "v0.8 수정 (2026-11-10)" 행 추가)

  • 공통 규칙 6장 문체 표와 22번 요청 style 설명에서 ESSAY 삭제
  • 22번 AI422_1: 메시지 "부적절한 표현이 있어 교정할 수 없어요. 수정 후 다시 시도해 주세요.", 설명 "혐오·차별 표현 또는 욕설·비속어 감지. 횟수 미차감"
  • 22번 비고와 CLAUDE.md의 횟수 처리 문장: "혐오 표현 차단" → "혐오 표현·욕설 차단"

테스트

  • 상수 6개 이름·순서가 명세와 같음
  • 6개 문체 지시문이 비어 있지 않고 서로 다름. 공통 지시 4가지와 문체 이름 줄이 모두 들어 있음
  • 모든 문체 지시문에 욕설·비속어(초성·변형 표기 포함) 차단 문장과 원문에 없는 문장 덧붙이기 금지 문장이 있고, 순화 문장은 없음
  • 상사/외부용 지시에 인사·맺음말을 항상 붙인다는 문장, 이미 있으면 덧붙이지 않는다는 문장, 약속·제안·사과 금지 문장이 있음
  • <text> 감싸기, 가짜 클라이언트 결과가 "[가짜 교정] " + 원문
  • 표식 판정
    • 참: 표식만 있거나, 앞뒤에 공백·NBSP·BOM·전각 공백·LF·CRLF·탭만 있음
    • 거짓: null, 빈 값, 문장 안에 섞임, 뒤에 마침표, 따옴표로 감쌈, 표식 두 번, 소문자, 괄호 하나, 중간 공백
  • 테스트 코드에는 욕설·혐오 예문 원문을 넣지 않음

실제 모델 확인

  • 모델 claude-haiku-5-5, 요청 본문은 MessagesRequest와 같은 4개 필드, 생각 설정 기본값(조건 A)
  • max_tokens 4000 (3000자 원문 L1만 [feat] AI 톤 교정 API #65 상한 후보인 6000)
  • 예문은 모두 직접 만든 문장이고 저장소에는 넣지 않음. 아래는 종류만 적음
  • 회차당 66회 호출 (새 경우 15개 × 3회 + 회귀 21회). 지시문을 두 번 고쳐 3회 실행했고, 아래 표는 최종 지시문(3차) 결과

최종 결과 (3차)

경우 종류 문체 기대 결과
P1 강한 욕설이 섞인 불만 편한 반말·부드러운 존댓말 표식만 6/6 표식, 섞임 0
P2 가벼운 비속어 한 단어 / 가벼운 비속어 두 개(이전 순화 예문) 부드러운 존댓말·편한 반말 표식만 6/6 표식, 섞임 0
P3 약 2000자 업무 글 중간에 욕설 한 단어 보고/공문 표식만 3/3 표식, 섞임 0
P4 초성 표기 / 숫자 끼움·띄어쓰기 변형 표기 편한 반말·부드러운 존댓말 표식만 6/6 표식, 놓침 0
F1 욕설처럼 보이지만 아닌 단어 공지 정상 교정 3/3 교정
F2 욕설 금지·신고 안내 공지 공지 정상 교정 3/3 교정
F3 욕설 없는 짜증·불만 부드러운 존댓말 정상 교정 3/3 교정, 글쓴이 입장 유지
G1 원문에 인사·호칭 없는 한 줄 보고 상사/외부용 인사·맺음말 있음, 그 밖에 추가 없음 3/3 통과, 호칭 만들지 않음
G2 원문에 인사·맺음말 있음 상사/외부용 중복 없음 3/3 통과
N1 일정 변경 공지 (사과 없음) 공지 사과·양해 추가 0 3/3 통과
N2 사과가 있는 공지 공지 사과 유지 3/3 유지
M1 상품 소개 마케팅 행동 유도 문구 추가 0 3/3 통과, 금액 표기 유지
회귀 혐오 H1~H3, 긴 글 중 혐오 한 문장 X1×5 표식만 8/8 표식, 섞임 0
회귀 지시 무시 유도 2종 (</text> 탈출 포함) 지시를 글로 교정 이전과 같음
회귀 {{변수}}·날짜·시간·금액·수량 (4개) 원문 표기 유지 이전과 같음. 원문 맨 앞 호칭도 유지
회귀 혐오 비판·신고 안내 2종 정상 교정 이전과 같음
회귀 3000자 원문 보고/공문 (L1×5, 6000) max_tokens 종료 0 종료 0, 결과 33943643자, 11.413.4초
  • 판정 기준(욕설 섞임 0, 오탐 0, 상사/외부용 인사·맺음말과 중복·약속·제안·사과 없음, 공지·마케팅 추가 문장 0, 회귀 동일) 모두 충족
  • 남은 점
    • L1 결과는 5회 모두 3000자 초과 (이전 6000 확인 3108~3527자와 비슷). 결정대로 프론트가 저장 전 안내
    • L1 5회 중 1회가 첫 줄 제목에 마크다운 굵게(**)를 씀 (지시문에서 금지했지만 이전 effort low 조건에서도 나온 현상). #65에서 후처리 여부 판단 필요

회차별 경과

회차 지시문 실패 대응
1차 결정 반영 직후 교정 결과에 설명 문장 덧붙임(3회), 원문 사과를 지움(공지), 금액 표기 변경(마케팅 3회), 글쓴이 불만을 위로하는 말로 바꿈(3회), 원문 호칭 삭제(상사/외부용) 1차 수정
2차 1차 수정 위로하는 말과 영어 자기 수정 문장(1회), 원문 호칭 삭제(1회), 공지 머리말·제목 추가(2회) 2차 수정
3차 2차 수정 (최종) 없음 -

이전 확인에서 이어지는 결론

  • 생각 기능: Haiku 5.5는 적응형 생각이 기본으로 켜져 있고 생각 토큰도 출력 토큰·max_tokens에 포함됨. output_config.effort: low는 출력 토큰을 줄였지만 오차단·지시 응답·문장 삭제·금액 표기 변경·마크다운 사용이 생겨 기본값(A)을 쓰고 global/client/llm은 고치지 않음
  • 출력 토큰 상한: 3000자 원문 보고/공문 교정이 4000에서 5회 중 2회 max_tokens로 끝남. 6000에서는 0회(이번 3차도 0회). #65에서 6000으로 확정

#65에서 반영할 것

  • AiErrorCode에 AI422_1 추가 (문구는 위 명세 변경 그대로)
  • 출력 토큰 상한 6000, CLAUDE.md의 "출력 토큰 상한 4000" 문구와 명세 22번 비고의 "출력 토큰 상한(4,000)" 수정
  • 응답 시간과 출력 토큰 수(원문·결과 제외)를 로그로 남겨 20초 제한 여유 확인 (L1 11~15초)

#65에서 결정 필요

  • 표식이 문장 안에 섞인 응답 처리. 지금까지 섞인 경우 0건이지만, 지금 판정으로는 섞이면 표식 문자열이 교정 결과로 그대로 나감
  • 결과의 마크다운 기호(**) 후처리 여부

확인 체크리스트

  • ./gradlew build 통과
  • 테스트 포함
  • 변경 400줄 안팎 (develop 대비 276줄)
  • 병합된 마이그레이션 수정 안 함
  • 비밀 값·개인정보 없음 (예문은 직접 만든 문장, 저장소에 넣지 않음, 키 없음)
  • global 공통 코드를 바꿨다면 디스코드에 공유함 (변경 없음)

리뷰어에게

[중점] 지시문 문구(ToneCorrectionPrompt)와 표식을 이 클래스에 둔 판단. 실제 모델 결과는 '실제 모델 확인' 절 참고

@chjpooh2002 chjpooh2002 added feature 기능 개발 ai AI 톤 교정 labels Nov 9, 2026
@chjpooh2002 chjpooh2002 self-assigned this Nov 9, 2026
oTAETAEo
oTAETAEo previously approved these changes Nov 9, 2026

@oTAETAEo oTAETAEo left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

고생 하셨습니다 !

사용자가 선택한 톤 스타일에 따라 공통 지시에 문체별 지시가 붙어서 요청이 나가는 것으로 이해했습니다.
switch 문이 좀 길어 보여서 템플릿 메서드 패턴으로 빼면 어떨까 싶었는데, 문체마다 다른 게 문자열뿐이라 그대로 둔 의도로 이해했습니당

지시문 문구(ToneCorrectionPrompt)와 표식을 이 클래스에 둔 판단

적절한 것 같습니다 ! 특정 톤 스타일만 출력 토큰 상한이 달라지거나 후처리가 붙는 등 문체별로 동작이 달라지면, 그때 분리하면 좋을 것 같은 생각 입니다아 👍

@chjpooh2002

Copy link
Copy Markdown
Contributor Author

기획·프론트 답변을 반영해 커밋 3개를 추가했습니다 (a32e160, 9dd2861, b781b27). 이미 보셨다면 아래만 확인해 주세요.

  • 문체 6개: 감성/에세이(ESSAY) 삭제
  • 욕설·비속어 차단: 순화하지 않고 혐오 표현과 같이 표식만 출력 (가벼운 비속어, 초성·변형 표기 포함). 욕설 없는 짜증이나 욕설 금지 안내 글은 그대로 교정
  • 상사/외부용: 인사·맺음말을 항상 붙임. 원문에 이미 있으면 덧붙이지 않고, 원문의 호칭은 유지
  • 덧붙이기 금지: 원문에 없는 문장(사과, 감사, 행동 유도, 머리말 등)을 덧붙이지 않음. 예외는 상사/외부용 인사·맺음말
  • 실제 모델 확인 중 함께 고친 것: 교정 설명 문장 금지, 금액 표기 방식 유지, 글쓴이 입장 유지
  • 명세: ESSAY 삭제, AI422_1 문구 변경 ("부적절한 표현이 있어 교정할 수 없어요. 수정 후 다시 시도해 주세요."). 코드 반영은 [feat] AI 톤 교정 API #65
  • 실제 모델 확인: 지시문을 두 번 고쳐 3차에서 판정 기준 모두 충족 (66회). 결과 표는 본문 '실제 모델 확인' 절에 있습니다

@oTAETAEo oTAETAEo left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

고생하셨습니다아 🙇‍♂️

@chjpooh2002
chjpooh2002 merged commit 5427a06 into develop Nov 10, 2026
1 check passed
@chjpooh2002
chjpooh2002 deleted the feat/64-tone-style-prompt branch November 10, 2026 11:15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ai AI 톤 교정 feature 기능 개발

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[feat] AI 톤 교정 문체 열거형 · 문체별 지시문

2 participants